﻿using PtlSave.Util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PtlSave.Model
{
    public class ColumnInfo
    {
        //字段名称 数据库
        public string columnNameTaos { get; set; } = "";
        //字段名称 实际json中保持的
        public string columnName { get; set; } = "";
        public int layer { get; set; } = 0;
        //当前字段内循环编号
        public int loopIdx { get; set; } = -1;
        public string parentLoop { get; set; } = "";
        public bool isParent { get; set; } = false; //是否是父节点，父节点不创建字段，不保存数据，作为取数据用
        //涛思数据库字段信息如下
        //1	TIMESTAMP	8	时间戳。缺省精度毫秒，可支持微秒。从格林威治时间 1970-01-01 00:00:00.000 (UTC/GMT) 开始，计时不能早于该时间。（从 2.0.18 版本开始，已经去除了这一时间范围限制）
        //2	INT	4	整型，范围[-2 ^ 31 + 1, 2 ^ 31 - 1], -2^31 用作 NULL
        //3	BIGINT	8	长整型，范围[-2 ^ 63 + 1, 2 ^ 63 - 1], -2^63 用于 NULL
        //4	FLOAT	4	浮点型，有效位数 6-7，范围[-3.4E38, 3.4E38]
        //5	DOUBLE	8	双精度浮点型，有效位数 15-16，范围[-1.7E308, 1.7E308]
        //6	BINARY 自定义 记录单字节字符串，建议只用于处理 ASCII 可见字符，中文等多字节字符需使用 nchar。
        //  理论上，最长可以有 16374 字节，但由于每行数据最多 16K 字节，实际上限一般小于理论值。binary 仅支持字符串输入，字符串两端需使用单引号引用。使用时须指定大小，如 binary(20) 定义了
        //  最长为 20 个单字节字符的字符串，每个字符占 1 byte 的存储空间，此时如果用户字符串超出 20 字节将会报错。对于字符串内的单引号，可以用转义字符反斜线加单引号来表示，即 \’。
        //7	SMALLINT	2	短整型， 范围[-32767, 32767], -32768 用于 NULL
        //8	TINYINT	1	单字节整型，范围[-127, 127], -128 用于 NULL
        //9	BOOL	1	布尔型，{true, false}
        //10	NCHAR 自定义 记录包含多字节字符在内的字符串，如中文字符。每个 nchar 字符占用 4 bytes 的存储空间。字符串两端使用单引号引用，字符串内的单引号需用转义字符 \’。nchar 使用时须
        //      指定字符串大小，类型为 nchar(10) 的列表示此列的字符串最多存储 10 个 nchar 字符，会固定占用 40 bytes 的空间。如果用户字符串长度超出声明长度，将会报错。
        public string columnType {
            get {
                return cfgTypeToTaosType.ContainsKey(typeCfg.ToUpper()) ? cfgTypeToTaosType[typeCfg.ToUpper()] : "NCHAR";
            }
        }
        //配置文件中配置的类型
        public string typeCfg { get; set; } = "STRING"; //配置文件配置的类型
        //字段长度
        private int _columnLen { get; set; } = 1;
        //数据库中一共配置的字段长度
        public int columnLen {
            get
            {
                int l = _columnLen * (cfgTypesLen.ContainsKey(typeCfg.ToUpper()) ? cfgTypesLen[typeCfg.ToUpper()] : 1);
                return l > 1500 ? 1500 : l;
            }
            set
            {
                _columnLen = value;
            }
        }
        //字段相关详细信息
        public Object field { get; set; } = null;
        //新增字段语句
        public string GetColAddSql(string tableName)
        {
            //使用数据类型 binary 或 nchar，需指定其最长的字节数
            //字段长度建议不超过2000
            return "ALTER STABLE " + tableName + " ADD COLUMN " + columnNameTaos + " " +
                columnType + (("BINARY".Equals(columnType) || "NCHAR".Equals(columnType)) ? "(" + columnLen.ToString() + ")" : "");
        }
        //配置字段类型和涛思字段类型对应关系
        private Dictionary<string, string> cfgTypeToTaosType = new Dictionary<string, string>()
        {
            {"UNKOWN","NCHAR"},
            {"UINT8","INT"},
            {"UINT32","INT"},
            {"UINT16REF","INT"},
            {"UINT16","INT"},
            {"UINT","INT"},
            {"UCHAR","NCHAR"},
            {"STRUCTLOOP","NCHAR"},
            {"STRUCT","NCHAR"},
            {"STRING","NCHAR"},
            {"SHORT","INT"},
            {"MULTIPATHDATA","NCHAR"},
            {"MAC","NCHAR"},
            {"LONG","BIGINT"},
            {"IPV4_4","NCHAR"},
            {"IPV4","NCHAR"},
            {"HEXSTR","NCHAR"},
            {"FLOAT","FLOAT"},
            {"ENUM","NCHAR"},
            {"BYTE","NCHAR"},
            {"BOOL","NCHAR"},
            {"BITARRAY","NCHAR"},
            {"BIT","NCHAR"},
            {"TIMESTAMP","TIMESTAMP"}
        };

        //配置字段类型应设置长度匹配关系，value为倍数
        private Dictionary<string, int> cfgTypesLen = new Dictionary<string, int>()
        {
            {"UNKOWN",4},
            {"UINT8",4},
            {"UINT32",4},
            {"UINT16REF",4},
            {"UINT16",4},
            {"UINT",4},
            {"UCHAR",5},
            {"STRUCTLOOP",8},
            {"STRUCT",5},
            {"STRING",2},
            {"SHORT",4},
            {"MULTIPATHDATA",4},
            {"MAC",20},
            {"LONG",6},
            {"IPV4_4",16},
            {"IPV4",16},
            {"HEXSTR",4},
            {"FLOAT",4},
            {"ENUM",16}, //枚举
            {"BYTE",4},
            {"BOOL",4}, //布尔值，0 or 1
            {"BITARRAY",4},    //
            {"BIT",4}
        };
    }
}
